// 重试逻辑
import axios from "axios";
import type { AxiosRequestConfig, AxiosResponse } from "axios";

/**
 * 异步重试请求函数
 *
 * 本函数尝试发起网络请求，并在请求失败时自动重试指定次数每次重试之间添加指定的延迟时间
 * 主要用于处理网络不稳定导致的请求失败情况，通过重试机制提高请求成功的概率
 *
 * @param config Axios请求配置，详见AxiosRequestConfig类型
 * @param retryCount 重试次数，默认为2次
 * @param delayMs 每次重试之间的延迟时间，单位为毫秒，默认为1000毫秒
 * @returns 返回Axios响应对象Promise
 * @throws 当所有重试均失败时，抛出最后一次错误
 */
export async function retryRequest(
  config: AxiosRequestConfig,
  retryCount = 2,
  delayMs = 1000
): Promise<AxiosResponse> {
  let lastError: any;
  for (let i = 0; i <= retryCount; i++) {
    try {
      // 尝试发起请求，如果成功则返回响应
      return await axios(config);
    } catch (err) {
      // 捕获到错误，保存最后一次错误信息
      lastError = err;
      // 如果当前重试次数未达到上限，则等待指定时间后再次尝试
      if (i < retryCount) {
        await new Promise((r) => setTimeout(r, delayMs));
      }
    }
  }
  // 所有重试均失败，抛出最后一次错误
  throw lastError;
}
